undeexcepturi
Version:
TypeScript ORM for Node.js based on Data Mapper, Unit of Work and Identity Map patterns. Supports MongoDB, MySQL, PostgreSQL and SQLite databases as well as usage with vanilla JavaScript.
121 lines (86 loc) • 2.54 kB
text/typescript
import { Collection, Entity, Ref, LoadStrategy, ManyToOne, MikroORM, OneToMany, PrimaryKey, Property } from '@mikro-orm/sqlite';
()
export class Manager {
()
id!: number;
()
name!: string;
('Project', { ref: true })
project!: Ref<Project>;
constructor(name: string) {
this.name = name;
}
}
()
export class Owner {
()
id!: number;
()
name!: string;
('Risk', { ref: true })
risk!: Ref<Risk>;
constructor(name: string) {
this.name = name;
}
}
()
export class Risk {
()
id!: number;
()
value!: string;
(() => Owner, owner => owner.risk)
owners = new Collection<Owner>(this);
('Project', { ref: true })
project!: Ref<Project>;
constructor(value: string) {
this.value = value;
}
}
()
export class Project {
()
id!: number;
()
name: string;
(() => Risk, risk => risk.project, { eager: true })
risks = new Collection<Risk>(this);
(() => Manager, manager => manager.project, { eager: true })
managers = new Collection<Manager>(this);
constructor(name: string) {
this.name = name;
}
}
describe('GH issue 1352', () => {
let orm: MikroORM;
beforeAll(async () => {
orm = await MikroORM.init({
dbName: ':memory:',
entities: [Project, Owner, Risk, Manager],
loadStrategy: LoadStrategy.JOINED,
});
await orm.schema.createSchema();
});
afterAll(async () => {
await orm.close(true);
});
test(`GH issue 1352`, async () => {
const project = new Project('Apartment construction');
const manager1 = new Manager('John 1');
const manager2 = new Manager('John 2');
const manager3 = new Manager('John 3');
const risk1 = new Risk('Wild animals');
const risk2 = new Risk('Oil pipe');
const risk3 = new Risk('Earth quake');
risk1.owners.add(new Owner('Some name 1'));
risk2.owners.add(new Owner('Some name 2'));
risk3.owners.add(new Owner('Some name 3'));
project.managers.add(manager1, manager2, manager3);
project.risks.add(risk1, risk2, risk3);
await orm.em.persistAndFlush(project);
orm.em.clear();
const queriedProject = await orm.em.findOneOrFail(Manager, manager1, { populate: ['project'] });
expect(queriedProject.project.unwrap().managers.isInitialized()).toBeTruthy();
expect(queriedProject.project.unwrap().risks.isInitialized()).toBeTruthy();
});
});