我有以下物體:
@Entity
@Getter
@Setter
@NoArgsConstructor
@Table(name = "TYPE")
public class Type implements Serializable {
private static final long serialVersionUID = 563398089758359222L;
@NotNull
@Column(name = "OBJECT_TYPE")
private String objectType;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "TypeNameId")
@SequenceGenerator(name = "TypeNameId", sequenceName = "SQ_TNAME_WL", allocationSize = 1)
private Long id;
@NotNull
@ToString.Include
private String code;
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "BOUND_TO_ID", referencedColumnName = "ID")
@JoinColumn(name = "BOUND_TO_CLASS", referencedColumnName = "OBJECT_TYPE")
private Set<Translation> translations;
}
@Entity
@Getter
@Setter
@NoArgsConstructor
@Table(name = "TRANSLATION")
public class Translation implements Serializable {
private static final long serialVersionUID = -4974947078465122824L;
@NotNull
@Column(name = "OBJECT_TYPE")
private String objectType;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "TranslationId")
@SequenceGenerator(name = "TranslationId", sequenceName = "SQ_LTRANSLATION_WL", allocationSize = 1)
private Long id;
@Size(max = 4000)
@Column(name = "VALUE")
private String value;
@Size(max = 150)
@Column(name = "LOCALE")
private String locale;
@Size(max = 150)
@Column(name = "BOUND_TO_CLASS")
private String boundToClass;
@Column(name = "BOUND_TO_ID")
private Long boundToId;
}
其他物體也可能在 Translations 表中有他們的翻譯,但不包括與 Translation 物體相關的映射。在創建帶有翻譯的型別時,Hibernate 想要執行以下 SQL:
Hibernate:插入型別(code,object_type,id)值(“code”,“Type”,1)
Hibernate:插入翻譯(bound_to_class,bound_to_id,locale,object_type,value,id)值(null,null,“en_US”,“Translation”,“American code”,2)
在 bound_to_id、bound_to_class 和 locale 列上有一個不可延遲的唯一約束。由于在 Hibernate SQL 中 bound_to_class 和 bound_to_id 為空,因此無法在同一語言環境中為不同型別創建翻譯。
How do I change the mappings to allow translation creations without making the unique constraint deferrable or using bidirectional association?
uj5u.com熱心網友回復:
除了建立雙向關系:
public class Type {
..
@OneToMany(mappedBy="type", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
private Set<Translation> translations;
}
..
public class Translation {
..
@ManyToOne
@JoinColumn(name = "BOUND_TO_ID", referencedColumnName = "ID")
@JoinColumn(name = "BOUND_TO_CLASS", referencedColumnName = "OBJECT_TYPE")
Type type;
}
然后將為您設定 fk 值,另一種方法是自己在 Translation 中映射 BOUND_TO_ID 和 BOUND_TO_CLASS,然后自己從任何 Type 實體中提取它們:
public class Translation {
..
@Column(name = "BOUND_TO_CLASS")
private String objectType;
@Column(name = "BOUND_TO_ID")
private Long objectId;
}
然后,您需要將 Type 中的關系標記為只讀:
public class Type {
..
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "BOUND_TO_ID", referencedColumnName = "ID", updatable=false, insertable=false)
@JoinColumn(name = "BOUND_TO_CLASS", referencedColumnName = "OBJECT_TYPE", updatable=false, insertable=false)
private Set<Translation> translations;
}
由于生成了 Type id,您需要先在 Type 上呼叫 persist,重繪 背景關系以確保分配了 ID,然后使用 ID 和 objectType 設定您希望創建的任何 Transaction 實體以指向它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/424549.html
上一篇:如果我的id是字串,如何使用deleteByIdjpa存盤庫?
下一篇:給我最高價值的JPQL查詢
