ormbridge 0.9.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/cliRunner.js +3 -3
- package/dist/cliRunner.js.map +1 -1
- package/dist/config.d.ts +2 -2
- package/dist/emitters/jpa.d.ts +36 -0
- package/dist/emitters/jpa.js +253 -0
- package/dist/emitters/jpa.js.map +1 -0
- package/dist/emitters/jpaColumns.d.ts +25 -0
- package/dist/emitters/jpaColumns.js +341 -0
- package/dist/emitters/jpaColumns.js.map +1 -0
- package/dist/emitters/jpaDefaults.d.ts +24 -0
- package/dist/emitters/jpaDefaults.js +223 -0
- package/dist/emitters/jpaDefaults.js.map +1 -0
- package/dist/emitters/jpaEnums.d.ts +11 -0
- package/dist/emitters/jpaEnums.js +134 -0
- package/dist/emitters/jpaEnums.js.map +1 -0
- package/dist/emitters/jpaFormat.d.ts +16 -0
- package/dist/emitters/jpaFormat.js +73 -0
- package/dist/emitters/jpaFormat.js.map +1 -0
- package/dist/emitters/jpaKeys.d.ts +25 -0
- package/dist/emitters/jpaKeys.js +110 -0
- package/dist/emitters/jpaKeys.js.map +1 -0
- package/dist/emitters/jpaNames.d.ts +26 -0
- package/dist/emitters/jpaNames.js +234 -0
- package/dist/emitters/jpaNames.js.map +1 -0
- package/dist/emitters/jpaRelations.d.ts +41 -0
- package/dist/emitters/jpaRelations.js +304 -0
- package/dist/emitters/jpaRelations.js.map +1 -0
- package/dist/emitters/jpaRender.d.ts +10 -0
- package/dist/emitters/jpaRender.js +81 -0
- package/dist/emitters/jpaRender.js.map +1 -0
- package/dist/emitters/jpaScalars.d.ts +32 -0
- package/dist/emitters/jpaScalars.js +188 -0
- package/dist/emitters/jpaScalars.js.map +1 -0
- package/dist/emitters/jpaTable.d.ts +10 -0
- package/dist/emitters/jpaTable.js +109 -0
- package/dist/emitters/jpaTable.js.map +1 -0
- package/dist/emitters/jpaTypes.d.ts +85 -0
- package/dist/emitters/jpaTypes.js +36 -0
- package/dist/emitters/jpaTypes.js.map +1 -0
- package/dist/formats.d.ts +3 -2
- package/dist/formats.js +34 -0
- package/dist/formats.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/io.js +27 -1
- package/dist/io.js.map +1 -1
- package/dist/parsers/javaSyntax.d.ts +120 -0
- package/dist/parsers/javaSyntax.js +304 -0
- package/dist/parsers/javaSyntax.js.map +1 -0
- package/dist/parsers/javaValues.d.ts +5 -0
- package/dist/parsers/javaValues.js +187 -0
- package/dist/parsers/javaValues.js.map +1 -0
- package/dist/parsers/jpa.d.ts +17 -0
- package/dist/parsers/jpa.js +131 -0
- package/dist/parsers/jpa.js.map +1 -0
- package/dist/parsers/jpaAnnotations.d.ts +46 -0
- package/dist/parsers/jpaAnnotations.js +156 -0
- package/dist/parsers/jpaAnnotations.js.map +1 -0
- package/dist/parsers/jpaBuild.d.ts +4 -0
- package/dist/parsers/jpaBuild.js +297 -0
- package/dist/parsers/jpaBuild.js.map +1 -0
- package/dist/parsers/jpaClasses.d.ts +27 -0
- package/dist/parsers/jpaClasses.js +257 -0
- package/dist/parsers/jpaClasses.js.map +1 -0
- package/dist/parsers/jpaCollections.d.ts +12 -0
- package/dist/parsers/jpaCollections.js +106 -0
- package/dist/parsers/jpaCollections.js.map +1 -0
- package/dist/parsers/jpaColumns.d.ts +26 -0
- package/dist/parsers/jpaColumns.js +361 -0
- package/dist/parsers/jpaColumns.js.map +1 -0
- package/dist/parsers/jpaEntities.d.ts +9 -0
- package/dist/parsers/jpaEntities.js +181 -0
- package/dist/parsers/jpaEntities.js.map +1 -0
- package/dist/parsers/jpaIndexes.d.ts +12 -0
- package/dist/parsers/jpaIndexes.js +87 -0
- package/dist/parsers/jpaIndexes.js.map +1 -0
- package/dist/parsers/jpaJoins.d.ts +68 -0
- package/dist/parsers/jpaJoins.js +131 -0
- package/dist/parsers/jpaJoins.js.map +1 -0
- package/dist/parsers/jpaModel.d.ts +73 -0
- package/dist/parsers/jpaModel.js +2 -0
- package/dist/parsers/jpaModel.js.map +1 -0
- package/dist/parsers/jpaNotes.d.ts +20 -0
- package/dist/parsers/jpaNotes.js +138 -0
- package/dist/parsers/jpaNotes.js.map +1 -0
- package/dist/parsers/jpaRelations.d.ts +4 -0
- package/dist/parsers/jpaRelations.js +242 -0
- package/dist/parsers/jpaRelations.js.map +1 -0
- package/dist/parsers/jpaTypes.d.ts +23 -0
- package/dist/parsers/jpaTypes.js +232 -0
- package/dist/parsers/jpaTypes.js.map +1 -0
- package/dist/styles.d.ts +3 -2
- package/dist/styles.js +4 -1
- package/dist/styles.js.map +1 -1
- package/package.json +8 -1
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { toCamelCase } from '../naming.js';
|
|
2
|
+
import { decapitalize, onDeleteAction } from './jpaTypes.js';
|
|
3
|
+
function descendants(entity) {
|
|
4
|
+
return entity.children.flatMap((child) => [
|
|
5
|
+
child,
|
|
6
|
+
...descendants(child),
|
|
7
|
+
]);
|
|
8
|
+
}
|
|
9
|
+
/** The discriminator value of an entity: `@DiscriminatorValue`, else the entity name. */
|
|
10
|
+
function discriminatorValue(entity) {
|
|
11
|
+
return (entity.notes.get('DiscriminatorValue')?.string('value') ?? entity.entityName);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Reads the inheritance strategy. Single-table subclasses are merged into the root (the discriminator column is
|
|
15
|
+
* added), joined subclasses get the foreign key to their parent as primary key, and table-per-class entities
|
|
16
|
+
* are independent tables; each case warns, because the shared model has no inheritance.
|
|
17
|
+
*/
|
|
18
|
+
export function inheritanceNotes(entity, fields, resolver) {
|
|
19
|
+
const parts = {
|
|
20
|
+
leadingFields: [],
|
|
21
|
+
trailingFields: [],
|
|
22
|
+
relations: [],
|
|
23
|
+
};
|
|
24
|
+
const warn = resolver.warn;
|
|
25
|
+
if (entity.inheritance === 'singleTable' &&
|
|
26
|
+
entity.root === entity &&
|
|
27
|
+
entity.children.length > 0) {
|
|
28
|
+
const column = entity.notes.get('DiscriminatorColumn');
|
|
29
|
+
const columnName = column?.string('name') || 'DTYPE';
|
|
30
|
+
const kind = column?.member('discriminatorType') ?? 'STRING';
|
|
31
|
+
const all = descendants(entity);
|
|
32
|
+
if (entity.notes.has('DiscriminatorFormula', true)) {
|
|
33
|
+
warn(`${entity.name}: @DiscriminatorFormula is computed in SQL and has no equivalent; a plain discriminator column was assumed.`);
|
|
34
|
+
}
|
|
35
|
+
if (!fields.some((field) => field.columnName === columnName)) {
|
|
36
|
+
parts.trailingFields.push({
|
|
37
|
+
name: toCamelCase(columnName),
|
|
38
|
+
columnName,
|
|
39
|
+
type: kind === 'INTEGER' ? 'int' : 'string',
|
|
40
|
+
isPrimaryKey: false,
|
|
41
|
+
isUnique: false,
|
|
42
|
+
isNullable: false,
|
|
43
|
+
isAutoUpdated: false,
|
|
44
|
+
...(kind === 'INTEGER'
|
|
45
|
+
? {}
|
|
46
|
+
: {
|
|
47
|
+
maxLength: kind === 'CHAR' ? 1 : (column?.number('length') ?? 31),
|
|
48
|
+
}),
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
warn(`${entity.name}: ${all.map((child) => child.name).join(', ')} extend${all.length === 1 ? 's' : ''} ${entity.name} in one table (single table inheritance). ` +
|
|
52
|
+
`The hierarchy was read as a single model with the columns of every class and the discriminator column "${columnName}" (values: ${[entity, ...all].map((item) => `${discriminatorValue(item)} = ${item.name}`).join(', ')}); the subclasses are not separate models. A column that a subclass declares NOT NULL stays NOT NULL, as in the DDL Hibernate writes.`);
|
|
53
|
+
}
|
|
54
|
+
if (entity.inheritance === 'joined' && entity.parent !== undefined) {
|
|
55
|
+
const parent = entity.parent;
|
|
56
|
+
const keys = resolver.keyOf(entity);
|
|
57
|
+
const only = keys[0];
|
|
58
|
+
if (only === undefined || keys.length > 1) {
|
|
59
|
+
warn(`${entity.name}: the parent ${parent.name} has a composite key; the join to the parent table was not read.`);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
const name = decapitalize(parent.name);
|
|
63
|
+
const action = entity.notes
|
|
64
|
+
.get('OnDelete', true)
|
|
65
|
+
?.member('action');
|
|
66
|
+
const onDelete = (action === undefined ? undefined : onDeleteAction(action)) ??
|
|
67
|
+
'noAction';
|
|
68
|
+
const relation = {
|
|
69
|
+
name,
|
|
70
|
+
kind: 'oneToOne',
|
|
71
|
+
targetModel: parent.name,
|
|
72
|
+
columnName: only.columnName,
|
|
73
|
+
isNullable: false,
|
|
74
|
+
onDelete,
|
|
75
|
+
isPrimaryKey: true,
|
|
76
|
+
};
|
|
77
|
+
parts.relations.push(relation);
|
|
78
|
+
parts.primaryKeyRelation = relation;
|
|
79
|
+
}
|
|
80
|
+
warn(`${entity.name}: extends ${parent.name} with joined table inheritance. It was read as a model of its own whose primary key is also a foreign key to ${parent.name} (a one-to-one primary key relation); the attributes inherited from ${parent.name} stay on ${parent.name}.`);
|
|
81
|
+
}
|
|
82
|
+
if (entity.inheritance === 'joined' && entity.root === entity) {
|
|
83
|
+
const column = entity.notes.get('DiscriminatorColumn');
|
|
84
|
+
if (column !== undefined) {
|
|
85
|
+
const columnName = column.string('name') || 'DTYPE';
|
|
86
|
+
parts.trailingFields.push({
|
|
87
|
+
name: toCamelCase(columnName),
|
|
88
|
+
columnName,
|
|
89
|
+
type: column.member('discriminatorType') === 'INTEGER' ? 'int' : 'string',
|
|
90
|
+
isPrimaryKey: false,
|
|
91
|
+
isUnique: false,
|
|
92
|
+
isNullable: false,
|
|
93
|
+
isAutoUpdated: false,
|
|
94
|
+
maxLength: column.number('length') ?? 31,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
if (entity.inheritance === 'tablePerClass') {
|
|
99
|
+
warn(`${entity.name}: table per class inheritance (${entity.parent === undefined ? 'root' : `extends ${entity.parent.name}`}). ${entity.name} was read as an independent table with all inherited columns; the shared model does not link it to the other classes of the hierarchy.`);
|
|
100
|
+
}
|
|
101
|
+
return parts;
|
|
102
|
+
}
|
|
103
|
+
/** Warns about table-level settings that have no place in the shared model. */
|
|
104
|
+
export function tableNotes(entity, built, warn) {
|
|
105
|
+
const notes = entity.notes;
|
|
106
|
+
const place = entity.name;
|
|
107
|
+
if (notes.has('SecondaryTable') || notes.has('SecondaryTables')) {
|
|
108
|
+
warn(`${place}: @SecondaryTable stores some attributes in a second table; all attributes were read into the primary table.`);
|
|
109
|
+
}
|
|
110
|
+
if (notes.has('Check', true) || notes.has('Checks', true)) {
|
|
111
|
+
warn(`${place}: the @Check constraint has no equivalent in the shared model and was dropped.`);
|
|
112
|
+
}
|
|
113
|
+
const comments = built
|
|
114
|
+
.filter((item) => item.member.attr.notes.has('Comment', true))
|
|
115
|
+
.map((item) => item.member.attr.name);
|
|
116
|
+
if (notes.has('Comment', true) || notes.get('Table', true)?.has('comment')) {
|
|
117
|
+
comments.unshift('the table');
|
|
118
|
+
}
|
|
119
|
+
if (comments.length > 0) {
|
|
120
|
+
warn(`${place}: comments (${comments.join(', ')}) are not preserved.`);
|
|
121
|
+
}
|
|
122
|
+
const checks = built
|
|
123
|
+
.filter((item) => item.member.attr.notes.has('Check', true))
|
|
124
|
+
.map((item) => item.member.attr.name);
|
|
125
|
+
if (checks.length > 0) {
|
|
126
|
+
warn(`${place}: the @Check constraints on ${checks.join(', ')} have no equivalent in the shared model and were dropped.`);
|
|
127
|
+
}
|
|
128
|
+
if (notes.has('SqlResultSetMapping') || notes.has('SqlResultSetMappings')) {
|
|
129
|
+
warn(`${place}: @SqlResultSetMapping maps query results, not tables, and was ignored.`);
|
|
130
|
+
}
|
|
131
|
+
if (notes.has('Audited', true) || notes.has('Audited')) {
|
|
132
|
+
warn(`${place}: @Audited (Hibernate Envers) also creates an audit table and a revision table, which are not read.`);
|
|
133
|
+
}
|
|
134
|
+
if (built.some((item) => item.member.attr.notes.has('TenantId', true))) {
|
|
135
|
+
warn(`${place}: a @TenantId column is part of the table; it was read as an ordinary column of the attribute's type.`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=jpaNotes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jpaNotes.js","sourceRoot":"","sources":["../../src/parsers/jpaNotes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type RelationOutput, type Resolver } from './jpaJoins.js';
|
|
2
|
+
import type { EntityInfo, Member } from './jpaModel.js';
|
|
3
|
+
/** Resolves the relationship attributes of one model. */
|
|
4
|
+
export declare function resolveRelations(model: EntityInfo, members: readonly Member[], resolver: Resolver): RelationOutput;
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
import { toCamelCase, toSnakeCase } from '../naming.js';
|
|
2
|
+
import { cleanIdentifier, columnNameOf, irFieldName } from './jpaColumns.js';
|
|
3
|
+
import { cascadeNote, constraintName, joinColumnsOf, joinPairs, modelOwner, onDeleteOf, relationAnnotation, tableNameOf, targetOf, } from './jpaJoins.js';
|
|
4
|
+
import { decapitalize } from './jpaTypes.js';
|
|
5
|
+
/** Resolves the relationship attributes of one model. */
|
|
6
|
+
export function resolveRelations(model, members, resolver) {
|
|
7
|
+
const output = {
|
|
8
|
+
relations: [],
|
|
9
|
+
composite: [],
|
|
10
|
+
extraFields: [],
|
|
11
|
+
consumed: new Map(),
|
|
12
|
+
foreign: [],
|
|
13
|
+
inverse: [],
|
|
14
|
+
};
|
|
15
|
+
members.forEach((member, order) => {
|
|
16
|
+
if (member.kind !== 'relation') {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
const annotation = relationAnnotation(member);
|
|
20
|
+
const place = `${model.name}.${member.path.join('.')}`;
|
|
21
|
+
const target = targetOf(member, annotation, resolver);
|
|
22
|
+
if (target === undefined) {
|
|
23
|
+
resolver.warn(`${place}: the target type ${member.attr.type.args[0]?.name ?? member.attr.type.name} of @${annotation.name} is not an entity in the input; the relationship was skipped.`);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
cascadeNote(member, annotation, place, resolver);
|
|
27
|
+
const mappedBy = annotation.string('mappedBy');
|
|
28
|
+
if (mappedBy !== undefined && mappedBy !== '') {
|
|
29
|
+
output.inverse.push({
|
|
30
|
+
model: modelOwner(target),
|
|
31
|
+
attribute: mappedBy.split('.').pop() ?? mappedBy,
|
|
32
|
+
relatedName: member.attr.name,
|
|
33
|
+
});
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
if (annotation.name === 'ManyToMany') {
|
|
37
|
+
manyToMany(model, member, target, order, output, resolver, place);
|
|
38
|
+
}
|
|
39
|
+
else if (annotation.name === 'OneToMany') {
|
|
40
|
+
oneToMany(model, member, target, order, output, resolver, place);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
toOne(model, member, annotation, target, order, output, resolver, place);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
return output;
|
|
47
|
+
}
|
|
48
|
+
function toOne(model, member, annotation, target, order, output, resolver, place) {
|
|
49
|
+
const pairs = joinPairs(member, target, resolver, place);
|
|
50
|
+
if (pairs === undefined) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const targetModel = modelOwner(target);
|
|
54
|
+
const isOneToOne = annotation.name === 'OneToOne';
|
|
55
|
+
const optional = annotation.boolean('optional') !== false;
|
|
56
|
+
const mapsId = member.attr.notes.get('MapsId');
|
|
57
|
+
// The older way to share a key: @PrimaryKeyJoinColumn makes the id column the foreign key.
|
|
58
|
+
const sharesKey = mapsId !== undefined || member.attr.notes.has('PrimaryKeyJoinColumn');
|
|
59
|
+
const declaredNotNull = member.attr.notes.has('NotNull');
|
|
60
|
+
const nullable = optional &&
|
|
61
|
+
!declaredNotNull &&
|
|
62
|
+
pairs.every((pair) => pair.nullable !== false) &&
|
|
63
|
+
!member.isId &&
|
|
64
|
+
!sharesKey;
|
|
65
|
+
const name = irFieldName(member);
|
|
66
|
+
const onDelete = onDeleteOf(member, place, resolver);
|
|
67
|
+
const unique = isOneToOne || pairs.some((pair) => pair.unique);
|
|
68
|
+
const kind = unique ? 'oneToOne' : 'foreignKey';
|
|
69
|
+
const constraint = constraintName(pairs[0], member, place, resolver);
|
|
70
|
+
const first = pairs[0];
|
|
71
|
+
if (first === undefined) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
// A shared key: @MapsId makes the foreign key the primary key (or a part of the embedded id).
|
|
75
|
+
let columnName = first.columnName;
|
|
76
|
+
let isKey = member.isId;
|
|
77
|
+
if (sharesKey) {
|
|
78
|
+
const part = mapsId?.string('value');
|
|
79
|
+
const idMembers = model.members.filter((item) => item.isId);
|
|
80
|
+
const mapped = part === undefined || part === ''
|
|
81
|
+
? idMembers[0]
|
|
82
|
+
: idMembers.find((item) => item.path[item.path.length - 1] === part);
|
|
83
|
+
if (mapped !== undefined) {
|
|
84
|
+
output.consumed.set(mapped.path.join('.'), name);
|
|
85
|
+
isKey = true;
|
|
86
|
+
if (mapsId === undefined) {
|
|
87
|
+
columnName = columnNameOf(mapped);
|
|
88
|
+
resolver.warn(`${place}: @PrimaryKeyJoinColumn shares the primary key, but Hibernate creates no foreign key constraint for it; it was read as a one-to-one primary key relation, so writers will add the constraint (@MapsId creates it in Hibernate, too).`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
resolver.warn(`${place}: the shared key names "${part ?? ''}", which is not an id attribute of ${model.name}.`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (pairs.length > 1) {
|
|
96
|
+
compositeKey(model, member, pairs, targetModel, kind, nullable, onDelete, output, resolver);
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
const referencedKey = resolver.keyOf(target);
|
|
100
|
+
const isPrimaryReference = referencedKey.length === 1 &&
|
|
101
|
+
referencedKey[0]?.columnName === first.target.columnName;
|
|
102
|
+
const relation = {
|
|
103
|
+
name,
|
|
104
|
+
kind,
|
|
105
|
+
targetModel: targetModel.name,
|
|
106
|
+
columnName,
|
|
107
|
+
isNullable: isKey ? false : nullable,
|
|
108
|
+
onDelete,
|
|
109
|
+
...(isPrimaryReference ? {} : { toField: first.target.name }),
|
|
110
|
+
...(isKey ? { isPrimaryKey: true } : {}),
|
|
111
|
+
...(constraint === undefined ? {} : { constraintName: constraint }),
|
|
112
|
+
};
|
|
113
|
+
output.relations.push({ order, relation });
|
|
114
|
+
const mirror = scalarOnColumn(model, columnName);
|
|
115
|
+
if (mirror !== undefined) {
|
|
116
|
+
output.consumed.set(mirror, name);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/** The path of a scalar member of the model that maps the same column (a read-only copy of the key). */
|
|
120
|
+
function scalarOnColumn(model, columnName) {
|
|
121
|
+
const found = model.members.find((member) => member.kind === 'basic' &&
|
|
122
|
+
!member.isId &&
|
|
123
|
+
columnNameOf(member).toLowerCase() === columnName.toLowerCase());
|
|
124
|
+
return found?.path.join('.');
|
|
125
|
+
}
|
|
126
|
+
function compositeKey(model, member, pairs, target, kind, nullable, onDelete, output, resolver) {
|
|
127
|
+
const targetFields = resolver.fieldsOf(target);
|
|
128
|
+
const local = [];
|
|
129
|
+
for (const pair of pairs) {
|
|
130
|
+
const existing = model.members.find((item) => item.kind === 'basic' &&
|
|
131
|
+
columnNameOf(item).toLowerCase() === pair.columnName.toLowerCase());
|
|
132
|
+
if (existing !== undefined) {
|
|
133
|
+
local.push(irFieldName(existing));
|
|
134
|
+
output.consumed.delete(existing.path.join('.'));
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
const referenced = targetFields.find((item) => item.field.name === pair.target.name);
|
|
138
|
+
const name = toCamelCase(pair.columnName);
|
|
139
|
+
output.extraFields.push({
|
|
140
|
+
name,
|
|
141
|
+
columnName: pair.columnName,
|
|
142
|
+
type: referenced?.field.type ?? 'unsupported',
|
|
143
|
+
isPrimaryKey: false,
|
|
144
|
+
isUnique: false,
|
|
145
|
+
isNullable: nullable,
|
|
146
|
+
isAutoUpdated: false,
|
|
147
|
+
...(referenced?.field.maxLength === undefined
|
|
148
|
+
? {}
|
|
149
|
+
: { maxLength: referenced.field.maxLength }),
|
|
150
|
+
...(referenced?.field.maxDigits === undefined
|
|
151
|
+
? {}
|
|
152
|
+
: { maxDigits: referenced.field.maxDigits }),
|
|
153
|
+
...(referenced?.field.decimalPlaces === undefined
|
|
154
|
+
? {}
|
|
155
|
+
: { decimalPlaces: referenced.field.decimalPlaces }),
|
|
156
|
+
});
|
|
157
|
+
local.push(name);
|
|
158
|
+
}
|
|
159
|
+
output.composite.push({
|
|
160
|
+
name: irFieldName(member),
|
|
161
|
+
targetModel: target.name,
|
|
162
|
+
fields: local,
|
|
163
|
+
references: pairs.map((pair) => pair.target.name),
|
|
164
|
+
kind,
|
|
165
|
+
isNullable: nullable,
|
|
166
|
+
onDelete,
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
function oneToMany(model, member, target, order, output, resolver, place) {
|
|
170
|
+
const targetModel = modelOwner(target);
|
|
171
|
+
if (joinColumnsOf(member).length === 0) {
|
|
172
|
+
// Without a join column Hibernate stores the link in a join table, like a many-to-many with a unique target.
|
|
173
|
+
resolver.warn(`${place}: a unidirectional @OneToMany without @JoinColumn uses a join table; it was read as a many-to-many relation (that each ${target.name} belongs to one ${model.name} is not represented).`);
|
|
174
|
+
manyToMany(model, member, target, order, output, resolver, place);
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
// @OneToMany with @JoinColumn: the foreign key is a column of the target's table.
|
|
178
|
+
const ownerKeys = resolver.keyOf(model);
|
|
179
|
+
const columns = joinColumnsOf(member);
|
|
180
|
+
const first = columns[0];
|
|
181
|
+
const key = ownerKeys[0];
|
|
182
|
+
if (first === undefined || key === undefined || columns.length > 1) {
|
|
183
|
+
resolver.warn(`${place}: a @OneToMany with several join columns (or an owner without a key) is not supported; the relationship was skipped.`);
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
const given = first.string('name');
|
|
187
|
+
const columnName = given === undefined || given === ''
|
|
188
|
+
? `${member.attr.name}_${key.columnName}`
|
|
189
|
+
: cleanIdentifier(given);
|
|
190
|
+
const name = decapitalize(model.name);
|
|
191
|
+
output.foreign.push({
|
|
192
|
+
model: targetModel,
|
|
193
|
+
relation: {
|
|
194
|
+
name,
|
|
195
|
+
kind: 'foreignKey',
|
|
196
|
+
targetModel: modelOwner(model).name,
|
|
197
|
+
columnName,
|
|
198
|
+
isNullable: first.boolean('nullable') !== false,
|
|
199
|
+
onDelete: onDeleteOf(member, place, resolver),
|
|
200
|
+
relatedName: member.attr.name,
|
|
201
|
+
},
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
function manyToMany(model, member, target, order, output, resolver, place) {
|
|
205
|
+
const name = irFieldName(member);
|
|
206
|
+
const relation = {
|
|
207
|
+
name,
|
|
208
|
+
kind: 'manyToMany',
|
|
209
|
+
targetModel: modelOwner(target).name,
|
|
210
|
+
columnName: `${toSnakeCase(name)}_id`,
|
|
211
|
+
isNullable: false,
|
|
212
|
+
onDelete: 'cascade',
|
|
213
|
+
};
|
|
214
|
+
output.relations.push({ order, relation });
|
|
215
|
+
joinTableNote(model, member, target, relation, resolver, place);
|
|
216
|
+
}
|
|
217
|
+
/** Warns when the join table or its columns differ from the names the other formats will derive. */
|
|
218
|
+
function joinTableNote(model, member, target, relation, resolver, place) {
|
|
219
|
+
const join = member.attr.notes.get('JoinTable');
|
|
220
|
+
const ownerKey = resolver.keyOf(model)[0];
|
|
221
|
+
const targetKey = resolver.keyOf(target)[0];
|
|
222
|
+
const ownerTable = tableNameOf(modelOwner(model));
|
|
223
|
+
const targetTable = tableNameOf(modelOwner(target));
|
|
224
|
+
const actualTable = join?.string('name') || `${ownerTable}_${targetTable}`;
|
|
225
|
+
const left = join?.annotations('joinColumns')[0];
|
|
226
|
+
const right = join?.annotations('inverseJoinColumns')[0];
|
|
227
|
+
const actualLeft = left?.string('name') ||
|
|
228
|
+
`${model.entityName}_${ownerKey?.columnName ?? 'id'}`;
|
|
229
|
+
const actualRight = right?.string('name') ||
|
|
230
|
+
`${member.attr.name}_${targetKey?.columnName ?? 'id'}`;
|
|
231
|
+
const isSelf = model.name === target.name;
|
|
232
|
+
const expectedTable = `${ownerTable}_${relation.name}`;
|
|
233
|
+
const expectedLeft = `${isSelf ? 'from_' : ''}${toSnakeCase(model.name)}_id`;
|
|
234
|
+
const expectedRight = `${isSelf ? 'to_' : ''}${toSnakeCase(target.name)}_id`;
|
|
235
|
+
if (actualTable !== expectedTable ||
|
|
236
|
+
actualLeft !== expectedLeft ||
|
|
237
|
+
actualRight !== expectedRight) {
|
|
238
|
+
resolver.warn(`${place}: the join table "${actualTable}" (columns ${actualLeft}, ${actualRight}) is not preserved by name; ` +
|
|
239
|
+
`formats that derive join tables will use "${expectedTable}" (columns ${expectedLeft}, ${expectedRight}).`);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
//# sourceMappingURL=jpaRelations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jpaRelations.js","sourceRoot":"","sources":["../../src/parsers/jpaRelations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { IrOnDelete } from '../ir.js';
|
|
2
|
+
import type { JavaType } from './javaSyntax.js';
|
|
3
|
+
import type { ColumnShape } from './efcoreTypes.js';
|
|
4
|
+
export declare function isPrimitive(type: JavaType): boolean;
|
|
5
|
+
/** True for the integer types an identity or sequence key can have. */
|
|
6
|
+
export declare function isIntegerType(type: JavaType): boolean;
|
|
7
|
+
export declare function isCollectionType(type: JavaType): boolean;
|
|
8
|
+
export declare function isMapType(type: JavaType): boolean;
|
|
9
|
+
/** The element type of a collection or array, or undefined for other types. */
|
|
10
|
+
export declare function elementOf(type: JavaType): JavaType | undefined;
|
|
11
|
+
/**
|
|
12
|
+
* The column a Java type maps to by default, or undefined when JPA has no default for it (a class of your own,
|
|
13
|
+
* `Object`, a `Map`). `imports` tells `java.sql.Date` from `java.util.Date`.
|
|
14
|
+
*/
|
|
15
|
+
export declare function javaColumn(type: JavaType, imports: readonly string[]): ColumnShape | undefined;
|
|
16
|
+
/** The column type `@Temporal` selects. */
|
|
17
|
+
export declare function temporalColumn(kind: string): ColumnShape | undefined;
|
|
18
|
+
/** The IR type for a `SqlTypes.*` constant of `@JdbcTypeCode`; undefined when it is not one the model knows. */
|
|
19
|
+
export declare function jdbcTypeColumn(name: string): ColumnShape | undefined;
|
|
20
|
+
/** Maps a Hibernate `OnDeleteAction` constant to the referential action. */
|
|
21
|
+
export declare function onDeleteAction(name: string): IrOnDelete | undefined;
|
|
22
|
+
/** Lower-cases the first letter: `Post` is `post`, `URL` stays `URL`. */
|
|
23
|
+
export declare function decapitalize(name: string): string;
|