如何更新JDL文件并为@CollectionTable添加关联?已有表场景的修改方法
Hi there! Let's tackle your questions about updating JDL files and configuring @CollectionTable relationships clearly.
1. How to Update a JDL File and Add a @CollectionTable Relationship
First, let's recap: @CollectionTable in JPA is used to map collection-valued attributes (like lists of basic types or embeddable classes) to a separate database table, rather than embedding them directly in the parent entity's table. Here's how to translate this into JDL:
Step 1: Define the Embeddable Class (if using one)
If your collection is made up of embeddable objects (like a Phone type that isn't a full entity), start by defining it in JDL:
embeddable Phone { phoneNumber String required phoneType String }
Step 2: Add the Collection Property to Your Entity
Next, add the collection attribute to the parent entity (e.g., Customer):
entity Customer { firstName String required lastName String required // Add the collection property phones List<Phone> }
Step 3: Customize the @CollectionTable Mapping
By default, JDL will generate a basic @CollectionTable, but if you need to customize the table name, foreign key column, constraints, etc., add the JPA annotation directly in the JDL:
@CollectionTable( name = "customer_phone_numbers", // Custom table name joinColumns = @JoinColumn(name = "customer_fk"), // Custom foreign key column uniqueConstraints = @UniqueConstraint(columnNames = {"customer_fk", "phone_number"}) // Add unique constraints ) collection Customer.phones
When you regenerate your entities from this JDL, the phones property will include the fully configured @CollectionTable annotation.
2. Required JDL Modifications When You Already Have a customer Table, New phone Table, and Updated Phone Entity Mapping
Assuming you've manually updated your Phone embeddable/entity with the @CollectionTable mapping, here's what you need to adjust in your JDL to keep it in sync:
1. Add the Phone Embeddable/Entity Definition
If it's not already present, add the Phone type to your JDL. Since you're using @CollectionTable, Phone is likely an embeddable class (full entities use @OneToMany with @JoinTable instead):
embeddable Phone { // Match exactly the properties in your existing Phone class number String required type String }
2. Add the Collection Property to the Customer Entity
Ensure the Customer entity in JDL includes the phones collection property:
entity Customer { // Keep all your existing Customer properties firstName String required lastName String required // Add the phones collection phones List<Phone> }
3. Mirror Your Manual @CollectionTable Configuration
Add the same @CollectionTable annotation you used in your entity to the JDL, to ensure consistency between your code and JDL:
@CollectionTable( name = "phone", // Match the name of your new database table joinColumns = @JoinColumn(name = "customer_id"), // Match the foreign key column in your phone table // Include any other constraints/indexes you added manually indexes = @Index(columnList = "number") ) collection Customer.phones
4. Verify Existing Relationships
Double-check that there are no conflicting relationships in your JDL (like an accidental OneToMany between Customer and a Phone entity) that would overwrite your custom @CollectionTable mapping.
内容的提问来源于stack exchange,提问作者Viraj

