【问题标题】:Hibernate: using another entity's pk as pk gives org.hibernate.MappingException: Could not determine type errorHibernate:使用另一个实体的 pk 作为 pk 给出 org.hibernate.MappingException:无法确定类型错误
【发布时间】:2014-11-04 20:55:38
【问题描述】:

我想使用的数据库是这样的:

用户表: 用户 ID ...

User_Action 表: User_ID(fk到User.User_ID,应该是一一映射) ...

所以我有这门课:

@Entity
@Table(name="User")
public class User {

private long _ID;
@Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "User_ID", nullable = false, unique = true)
    public long get_ID() {
        return _ID;
    }

    public void set_ID(long user_ID) {
        _ID = user_ID;
    }
...
}

在另一个班级,我有:

@Entity
@Table(name="User_Action")
public class UserAction implements IEntity {

    private User _user;
    @Id
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "User_ID")
    public User get_user() {
        return _user;
    }
    public void set_user(User _user) {
        this._user = _user;
    }
...
}

但是运行代码会在初始化时抛出以下错误:

org.hibernate.MappingException: Could not determine type for: mycustom.User, for columns: [org.hibernate.mapping.Column(_user)]
org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:266)
org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:253)
org.hibernate.mapping.RootClass.validate(RootClass.java:193)
org.hibernate.cfg.Configuration.validate(Configuration.java:1099)
org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1284)
org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:859)

...

我使用的休眠版本是:

<dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>3.6.7.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>4.3.0.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-commons-annotations</artifactId>
        <version>3.3.0.ga</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-annotations</artifactId>
        <version>3.3.1.GA</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>3.3.2.GA</version>
    </dependency>

我怀疑 annoticationConfiguration 有问题,但无法确认或进一步调试..还是其他原因?

【问题讨论】:

标签: java hibernate


【解决方案1】:

有几点需要改变:

1) 消除类属性名称中的下划线(“_”)。尝试关注Java Beans naming conventions。这很重要,因为 Hibernate 需要这种类型的命名来调用类的公共访问器和修改器(又名 getter 和 setter)。

2) UserAction 需要自己的标识符属性。所述属性应使用@Id 注释其吸气剂。你目前已经用@Id注释了UserAction_user属性,这无疑会造成问题。 UserAction 将拥有自己的主键,并将 User 的 id 作为外键。

3) 考虑将一对一关系更改为一对多。不应该允许User 执行多个UserAction 吗?

【讨论】:

  • 感谢您的回复。只是跟进它:2)UserAction使用外键作为其主键,但是我不确定如何在类中表示它,所以我在UserAction中为_user留下了@id。那么问题来了,如何在hibernate中做超类型的事情呢? 3)是的,它确实是一对多的,我只是使用 1-1 来保持简单,因为这与问题有关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-10
  • 2016-08-16
  • 2019-07-02
  • 1970-01-01
  • 1970-01-01
  • 2011-09-15
  • 2014-11-29
相关资源
最近更新 更多