用Hibernate映射复合键会在Oracle中产生一个原始字段 [英] Mapping composite key with Hibernate produces a raw field in Oracle

查看:60
本文介绍了用Hibernate映射复合键会在Oracle中产生一个原始字段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

-事实....
在我的项目中,每个类/表都应该有几个(站点,结构)以提供多站点部署.

-- The Facts....
In my project every class/table should have a couple (Site,Structure) in order to provide multisite deploy.

我提供了一个安装类

@Entity
@Table(name="COM_INSTALLATION")
@IdClass(InstallationPK.class)
public class Installation implements Serializable{

private static final long serialVersionUID = 3601006283578715263L;

@Id
@Column(name = "site") 
private String site;
@Id
@Column(name = "structure")
private String structure;

/* ... constructor, getters, setters ... */
}

及其PK,如

public class InstallationPK implements Serializable {

private static final long serialVersionUID = 1L;
private String site;
private String structure;
/* .. constructor, getters, setters ... */
}

然后我有一个名为BaseEntity的MappedSuperclass

then I have a MappedSuperclass named BaseEntity

@MappedSuperclass
public class BaseEntity
{
private Installation installation;

@OneToOne
@JoinColumns({    
    @JoinColumn(name = "site", referencedColumnName = "site"),
    @JoinColumn(name = "structure", referencedColumnName = "structure")
})
public Installation getInstallation() {
    return installation;
}
public void setInstallation(Installation installation) {
    this.installation = installation;
}
}

到目前为止,

非常简单...扩展BaseEntity的每个@Entity和@Table注释类都包含一个SITE列,一个STRUCTURE列以及一个相关的外键.

quite easy so far... every @Entity and @Table annotated class extending BaseEntity contains a column SITE, a column STRUCTURE and a related foreign key.

-问题....
碰巧,使用实现org.springframework.security.core.userdetails.UserDetails的类并扩展BaseEntity,Hibernate不会创建两列,而是创建RAW类型的INSTALLATION列.那是课程

-- The Problem....
It happens that with a class implementing org.springframework.security.core.userdetails.UserDetails and extending BaseEntity, Hibernate does not create the two columns but an INSTALLATION column with RAW type. That's the class

@Entity
@Table(name="USR_USER", uniqueConstraints =    
@UniqueConstraint(columnNames = { "username" }))
@SequenceGenerator(name = "userId_seq_generator", sequenceName = "S_USER")
public class User  extends BaseEntity implements UserDetails{

private static final long serialVersionUID = 8698408700004341649L;

@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "userId_seq_generator")
private Long userId;
/* ... getter, setters, ... */
}

这就是结果

有什么想法吗?预先感谢

Any ideas? Thanks in advance

推荐答案

我没有评论的口碑,所以我将在这里发表我的评论:

I don't have point reputation to comment so i'll put here my comments:

为什么instalation.class中没有instalationPK字段?您应该在Installation.class的instalationPK字段中放入 @EmbeddedId .

Why instalationPK field isn't in instalation.class?? You should put @EmbeddedId in the field instalationPK in Installation.class.

如果差异不大,我可以将joinCollums放在 BaseEntity 的字段中:

I don't if makes differences, but put joinCollums on the field in BaseEntity:

@OneToOne
@JoinColumns({    
    @JoinColumn(name = "site", referencedColumnName = "site"),
    @JoinColumn(name = "structure", referencedColumnName = "structure")
})
private Installation installation;

这篇关于用Hibernate映射复合键会在Oracle中产生一个原始字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆