如何将Hibernate多对多关联配置从XML方式切换为注解方式?
把Hibernate多对多XML配置转为注解方式的步骤
没问题,我来帮你把这段XML配置转换成对应的Hibernate注解,完全对应原来的配置项,一步一步来:
首先,你需要在Supplier类的Units字段上添加以下注解,同时要导入对应的包(注意根据你的Hibernate版本选择javax.persistence或jakarta.persistence):
完整代码示例
// 导入必要的包 import jakarta.persistence.*; // Hibernate 6+用这个,5.x及以下用javax.persistence.* import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; import org.hibernate.annotations.Immutable; import java.util.Set; public class Supplier { // 其他字段和方法... @ManyToMany(targetEntity = com.org.Unit.class) @JoinTable( name = "UNIT", // 对应XML中的table="UNIT" joinColumns = @JoinColumn(name = "ID"), // 对应XML中的<key column="ID"/> inverseJoinColumns = @JoinColumn(name = "U_ID") // 对应XML中的<many-to-many column="U_ID"/> ) @Immutable // 对应XML中的mutable="false",标记集合为只读不可修改 @Cache(usage = CacheConcurrencyStrategy.READ_ONLY) // 对应XML中的<cache usage="read-only"/> private Set<Unit> Units; // 对应的getter和setter(如果需要的话,不过因为是只读,setter可以考虑只在初始化时使用) }
注解与原XML配置的对应关系
- @ManyToMany:替代XML中的
<many-to-many>标签,targetEntity属性指定关联的实体类,对应XML里的class="com.org.Unit"。如果Unit类已经通过import导入,这里可以简化为targetEntity = Unit.class。 - @JoinTable:用来配置多对多的中间表:
name属性对应XML中的table="UNIT";joinColumns配置当前Supplier实体在中间表的外键列,对应XML的<key column="ID"/>;inverseJoinColumns配置关联的Unit实体在中间表的外键列,对应XML的<many-to-many column="U_ID"/>。
- @Immutable:对应XML中的
mutable="false",告诉Hibernate这个集合是只读的,不会跟踪对它的修改操作(比如添加、删除元素)。 - @Cache:对应XML中的
<cache usage="read-only"/>,指定集合的缓存策略为只读,需要导入Hibernate专属的org.hibernate.annotations.Cache注解。
注意事项
- 如果你的Hibernate版本是5.x或更早,记得把
jakarta.persistence换成javax.persistence; - 因为配置了
@Immutable,这个集合应该只做查询使用,尽量不要在业务代码中修改它,否则Hibernate不会同步这些修改到数据库; - 如果Supplier和Unit的关联是双向的,你还需要在Unit类中配置对应的@ManyToMany注解,并设置
mappedBy属性指向Supplier的Units字段,不过你的XML配置里没有提到双向关联,所以如果是单向的话就不用管这部分。
内容的提问来源于stack exchange,提问作者Sourabh
相关产品推荐
相关产品推荐

