2017-05-01 56 views
2

我试图用Hibernate来实现这一目标: table relationshipJoinColumn一个外键

我的代码如下:

设备型号

@Entity 
public class Device { 
@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Column(nullable = false) 
private long id; 

@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "fk_user", nullable = true, referencedColumnName = "ID") 
private User user; 
... 
} 

统计模型

@Entity 
public class Statistic { 
@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Column(nullable = false) 
private long id; 

@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumns({ @JoinColumn(name = "fk_device", nullable = false, referencedColumnName = "ID"), 
     @JoinColumn(name = "fk_device_user", nullable = false, referencedColumnName = "fk_user") }) 
private Device device; 
... 
} 

但是,有一个错误说有设备中没有逻辑列fk_user。

Caused by: org.hibernate.MappingException: Unable to find column with logical name: fk_user in device 

我想这是因为fk_user是一个外键。但我该如何解决这个问题?谢谢。根据您的架构

回答

2

我将如下映射设备实体:

公共类Devince {

@ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "user_id", nullable = true) 
    private User user; 
    ... 
    } 

}

你不需要的referencedColumnName,你指的是User实体首要的关键。如果您要引用非主键列,那么这将是必要的。

关于统计单位:

public class Statistic { 
    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumns({ @JoinColumn(name = "device_id", nullable = false), 
     @JoinColumn(name = "device_user_id", nullable = false, 
    referencedColumnName = "user_id") }) 
    ... 
    } 
} 

同样,你只需要在第二@JoinColumnreferencesColumnName

+0

感谢您的建议。我在'@ JoinColumn'中删除了所有第一个'referencesColumnName',但仍然收到错误消息'Caused by:org.hibernate.MappingException:无法在设备中查找具有逻辑名称:user_id的列。 – Chiu