Hibernate @Any 及 @ManyToAny 使用教程

Stella981
• 阅读 568

前言

最好的老师是 google,不信你去试下百度

@Any 的使用方法

场景:假设一个车辆类,它可以是个人或者公司拥有:

@Entity
@DiscriminatorValue("PRS")
public class Person implements VehicleOwner { ... }

@Entity
@DiscriminatorValue("CPY")
public class Company implements VehicleOwner { ... }

使用@Any注解来映射关系:

@Entity
@DiscriminatorValue("VEH")
public class Vehicle {
    ...

    @Any(
       metaColumn=@Column(name="owner_type" , length=3),
       fetch=FetchType.LAZY
    )
    @AnyMetaDef(
       idType="long", metaType="string" ,
       metaValues={
          @MetaValue(targetEntity=Person.class, value="PRS" ),
          @MetaValue(targetEntity=Company.class, value="CPY" )
       }
    )
    @JoinColumn(name="owner_id" )
    public VehicleOwner getOwner() { ... }
    public void setOwner(VehicleOwner owner) { ... }

    ...    
}

在车辆表这将产生一个二元组(owner_type,owner_id),共同确定VehicleOwner对象是Person还是Company。

二 @ManyToAny  的使用方法

场景:假设一个车辆类,它可以是多个个人或者公司拥有:

@Entity
@DiscriminatorValue("VEH")
public class Vehicle {
    ...

    @ManyToAny(
        metaColumn = @Column( name = "owner_type" )
    )
    @AnyMetaDef(
        idType = "integer", metaType = "string",
        metaValues = {
            @MetaValue( targetEntity = Person.class, value="PRS" ),
            @MetaValue( targetEntity = Company.class, value="CPY" ) 
        }
    )
    @Cascade( { org.hibernate.annotations.CascadeType.ALL } )
    @JoinTable(
        name = "vehicle_owners", 
        joinColumns = @JoinColumn( name = "vehicle_id" ),
        inverseJoinColumns = @JoinColumn( name = "owner_id" )
    )
    public List<Property> getOwners() { ... }
    private void setOwners(List<VehicleOwner> owners) { ... }

    ...
}

这会生成一张vehicle_owners表(字段:vehicle_id,owner_type,owner_id)。vehicle_id识别车辆,owner_type,owner_id组合一起识别主人(无论是个人或公司)。

参考文档:http://jpaobjects.sourceforge.net/m2-site/main/documentation/docbkx/html/user-guide/ch04s09.html

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Easter79 Easter79
3年前
spring和JPA
Entity使用@Entity注解使javabean类成为实体类。一般使用@Id注解在成员变量或者其对应的get方法设置实体类的主键。例子:packagecom.hgf.jpa.domain;importjavax.persistence.Entity;importjavax
Souleigh ✨ Souleigh ✨
3年前
TypeScript: 请停止使用 any
当我们开发TypeScript代码时,很可能会遇到any关键字。我们看到的大多数用法都表明我们正在处理TypeScript中的基本类型。在文档中我们可能会找到:(…)来不使用TypeScript或第3方库编写的代码的值。在这些情况下,我们可能要选择退出类型检查。为此,我们将这些值标记为any类型:什么是any因此any
Souleigh ✨ Souleigh ✨
3年前
前端性能优化 - 雅虎军规
无论是在工作中,还是在面试中,web前端性能的优化都是很重要的,那么我们进行优化需要从哪些方面入手呢?可以遵循雅虎的前端优化35条军规,这样对于优化有一个比较清晰的方向.35条军规1.尽量减少HTTP请求个数——须权衡2.使用CDN(内容分发网络)3.为文件头指定Expires或CacheControl,使内容具有缓存性。4.避免空的
Karen110 Karen110
3年前
​一篇文章总结一下Python库中关于时间的常见操作
前言本次来总结一下关于Python时间的相关操作,有一个有趣的问题。如果你的业务用不到时间相关的操作,你的业务基本上会一直用不到。但是如果你的业务一旦用到了时间操作,你就会发现,淦,到处都是时间操作。。。所以思来想去,还是总结一下吧,本次会采用类型注解方式。time包importtime时间戳从1970年1月1日00:00:00标准时区诞生到现在
Stella981 Stella981
3年前
PostgreSQL数据库切割和组合字段函数
Postgresql里面内置了很多的实用函数,下面介绍下组合和切割函数环境:PostgreSQL9.1.2     CENTOS5.7final一.组合函数1.concata.语法介绍concat(str"any",str"any",...)
Wesley13 Wesley13
3年前
35岁,真的是程序员的一道坎吗?
“程序员35岁是道坎”,“程序员35岁被裁”……这些话咱们可能都听腻了,但每当触及还是会感到丝丝焦虑,毕竟每个人都会到35岁。而国内互联网环境确实对35岁以上的程序员不太友好:薪资要得高,却不如年轻人加班猛;虽说经验丰富,但大部分公司并不需要太资深的程序员。但35岁危机并不是不可避免的,比如你可以不断精进技术,将来做技术管理或者
Wesley13 Wesley13
3年前
3 OneToMany ManyToMany MappedBy Cascade
1双向1N关联对于1N关联,Hibernate推荐使用双向关联,而且不要让1的一方控制关联关系,而使用多的一方控制关联关系。a.一的一方 表示班级@Entity@Table(name"team_1")publicclassTeam{@Id@Gen
Stella981 Stella981
3年前
Hibernate Annotations @Any 使用场景
使用hibernate时,你是否遇到如下蛋疼大场景@Entity@Table(name"contr_Contract")@Cache(usageCacheConcurrencyStrategy.READ_WRITE)@MetaData(value"合同")publicclassCont