java - 为什么此代码示例会出现 org.hibernate.MappingException 异常?

标签 java hibernate

.hibernate.MappingException:实体映射中的重复列:com.sample.User2 列:CITY_NAME(应使用 insert="false"update="false"进行映射)

是我运行使用 Hibernate 和 MSSQL Server 的程序时遇到的异常。这是我的代码,来自在线教程。我不确定问题出在哪里,当然我已经用谷歌搜索了很多,但我发现的所有内容都有一个更明显的错误。我这里好像找不到啊请记住,这是我使用 Hibernate/JPA 的第二天。

com.sample.Address.java:

package com.sample;

import javax.persistence.Column;
import javax.persistence.Embeddable;

@Embeddable
public class Address {

    @Column(name="CITY_STREET")
    private String street;
    @Column(name="CITY_NAME")
    private String city;
    @Column(name="STATE")
    private String state;
    @Column(name="CITY_ZIP")
    private String zip;

    public Address() { }

    public Address(String street, String city, String state, String zip) {
        this.street = street;
        this.city = city;
        this.state = state;
        this.zip = zip;
    }
    //Setters and getters generate by Eclipse (omitted for length)
    //Note: No annotations on methods
}

com.sample.User2:

package com.sample;

import javax.persistence.AttributeOverride;
import javax.persistence.AttributeOverrides;
import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="FancyTable")
public class User2 {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="USER_ID")
    private int userId;
    @Column(name="USER_NAME")
    private String userName;
    @Embedded
    @AttributeOverrides({
        @AttributeOverride(column = @Column(name="HOME_STREET_NAME"), name = "CITY_STREET"),
        @AttributeOverride(column = @Column(name="HOME_CITY_NAME"), name = "CITY_NAME"),
        @AttributeOverride(column = @Column(name="HOME_STATE"), name = "STATE"),
        @AttributeOverride(column = @Column(name="HOME_CITY_ZIP"), name = "CITY_ZIP")})
    private Address homeAddress;
    @Embedded
    private Address officeAddress;

    public User2() { }

    //Setters and getters generated by Eclipse (Omitted for length)
    //Note: No annotations on methods
}

com.sample.HibernateTest3.java:

package com.sample;

import org.hibernate.Session;
import org.hibernate.SessionFactory;

public class HibernateTest3 {

    static void run() {

        User2 user = new User2();
        User2 user2 = new User2();

        user.setUserName("Test");
        user2.setUserName("Test 2");

        Address add1 = new Address();
        add1.setStreet("street 1");
        add1.setCity("city 1");
        add1.setState("state 1");
        add1.setZip("zip 1");

        Address add2 = new Address();
        add2.setStreet("street 2");
        add2.setCity("city 2");
        add2.setState("state 2");
        add2.setZip("zip 2");

        user.setHomeAddress(add1);
        user2.setHomeAddress(add2);

        user.setOfficeAddress(new Address("a", "b", "c", "d"));
        user.setOfficeAddress(new Address("X", "X", "X", "X"));


        SessionFactory sf = null;

        try {

            sf = HibernateUtils.createSessionFactory();

            Session session = sf.openSession();

            session.beginTransaction();
            session.save(user);
            session.save(user2);
            session.getTransaction().commit();

        } catch (Exception e) {

            System.out.println("ERROR");

            e.printStackTrace();

        } finally {

            try {

                HibernateUtils.close();

            } catch (Exception ex) {
                System.out.println("ERROR 2");

                ex.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {

        run();
    }
}

最后,我的 hibernate.cfg.xml 文件...

<?xml version='1.0' encoding='utf-8'?>
    <!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

    <hibernate-configuration>

    <session-factory>

        <!-- Database connection settings -->
        <property       name="connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>
        <property name="connection.url">jdbc:sqlserver://localhost:1433;databaseName=sample1</property>
        <property name="connection.username">sa</property>
        <property name="connection.password">OMMITED</property>

        <!-- MSSQL Dialect -->
        <property  name="dialect">org.hibernate.dialect.SQLServerDialect</property>

        <!-- JDBC connection pool (use the built-in) -->
        <property name="connection.pool_size">1</property>

        <!-- Disable the second-level cache  -->
        <property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>

        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>

        <!-- Drop and re-create the database schema on startup -->
        <property name="hbm2ddl.auto">create</property>

        <!-- Names the annotated entity class -->
        <mapping class="com.sample.User2"/>

    </session-factory>

</hibernate-configuration>

有人可以解释一下并告诉我到底是什么导致了这个错误吗?

最佳答案

来自 @AttributeOverride 的文档

(Required) The name of the property whose mapping is being overridden if property-based access is being used, or the name of the field if field-based access is used.

因此您应该使用字段名称而不是列名称,例如

@AttributeOverride(column = @Column(name="HOME_STREET_NAME"), name = "street")

否则列名称不会更改,并且您会遇到异常

关于java - 为什么此代码示例会出现 org.hibernate.MappingException 异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28627212/

相关文章:

java - 根据请求创建 Hibernate-Session

java - 嵌入式 jetty : Servlet not initialized

java - 我可以将扩展对象与其扩展的对象一起放入 java 的列表中吗?

java - 为什么我不能从 android(Java) 中的另一个类更新类的变量?

java - Hibernate 生成额外的查询

java - 保存多对多实体时出现问题

java - hibernate 不向数据库添加新记录

java - 如何让 servlet 过滤器在 Tomcat 中的应用程序启动时停止加载?

java - 在 hibernate 中映射引用项目中的类

java - 使用 @ManyToOne 和 @OneToMany 会导致 org.hibernate.exception.GenericJDBCException