【问题标题】:Hibernate persisting ArrayList - IssuesHibernate 持久化 ArrayList - 问题
【发布时间】:2014-01-27 11:41:17
【问题描述】:

无法正常工作。我正在创建一个带有锦标赛的站点,用户可以注册该站点。比赛将有一份注册会员名单。它不包含用户对象,只是用户电子邮件地址,无论如何这都是用户表的键。我想以这样一种方式存储数组列表,即我将拥有多个锦标赛 ID 副本,但每个锦标赛 ID 只有一个用户名实例。

例如 T_ID 用户名 1 汤姆 1 迈克 1约翰 2汤姆 2克里斯 2 蒂米 3 蒂米 3克里斯

这是表的 SQL。

DROP TABLE IF EXISTS `mtc`.`tournament` ;

CREATE TABLE IF NOT EXISTS `mtc`.`tournament` (
  `id` INT NOT NULL,
  `tournamentName` VARCHAR(100) NULL,
  `tournamentGender` VARCHAR(45) NULL,
  `tournamentType` VARCHAR(45) NULL,
  `tournamentCategory` VARCHAR(45) NULL,
  `tournamentStyle` VARCHAR(45) NULL,
  PRIMARY KEY (`id`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mtc`.`tournament_eligible`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mtc`.`tournament_eligible` ;

CREATE TABLE IF NOT EXISTS `mtc`.`tournament_eligible` (
  `id` INT NOT NULL,
  `username` VARCHAR(45) NULL,
  PRIMARY KEY (`id`),
  CONSTRAINT `fk_tournament_eligible_tournament1`
    FOREIGN KEY (`id`)
    REFERENCES `mtc`.`tournament` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

我有两个这样的课程。

Tournament.java

    @Entity
    @Table(name = "tournament")
    public class Tournament implements Event {

        @Id
        @GeneratedValue
        private int id;

        @OneToMany
        @JoinColumn(name = "id")
        private List<User> eligible; // Contains a list of eligible members

        @Size(min = 5, max = 45, message = "Tournament Name must be between 5 and 60 characters", groups = {
                PersistenceValidationGroup.class, FormValidationGroup.class })
        private String tournamentName; // Specified the name of the tournament

        private String tournamentGender = "MIXED"; // Specifies where a tournament
                                                    // is M(ale), F(emale) or MIXED;

        private String tournamentType = "S"; // Specifies S(ingles) or D(oubles)

        private String tournamentCategory = "O"; // Specifies Member_Type to be
                                                    // S(enior) only, J(unior) only,
                                                    // or O(pen) Tournament

        private String tournamentStyle = "L"; // Specfies type of Tournament to be
                                                // (L)adder/(L)eague, (B)ucket or
                                                // (G)roup - Probably change this to
                                                // a class later on.

        public Tournament() {
            this.eligible = new ArrayList<User>();
        }

// getters and setters

寄存器类

    @Entity
    @Table(name="tournament_eligible")
    public class Registered {


        @Id
        @Column(name="id")
        private int tournamentID;

        @Column(name="username")
        private String username;

        @OneToMany(mappedBy="tournament")
        private List<String> registered;

// getter and setters

我使用的是正确的 javax.* 注释,而不是 Hibernate 注释。

当前错误:原​​因:org.hibernate.AnnotationException:@OneToOne 或 @ManyToOne on events.tournaments.Tournament.eligible 引用了一个未知实体:java.util.List

我确实设置了 Hibernate 配置以查看带有注册实体的包。

<beans profile="production">
        <jee:jndi-lookup jndi-name="jdbc/mtc" id="dataSource"
            expected-type="javax.sql.DataSource">
        </jee:jndi-lookup>
        <bean id="transactionManager"
            class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource"></property>
        </bean>
        <tx:annotation-driven />
        <bean id="sessionFactory"
            class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
            <property name="dataSource" ref="dataSource"></property>
            <property name="hibernateProperties">
                <props>
                    <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
                </props>
            </property>
            <property name="packagesToScan">
                <list>
                    <value>users</value>
                    <value>dao</value>
                    <value>events.tournaments</value>
                </list>
            </property>
        </bean>
        <bean id="exceptionTranslator"
            class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor">
        </bean>
    </beans>

【问题讨论】:

    标签: hibernate spring-mvc arraylist persistence


    【解决方案1】:
    @Entity
    @Table(name="tournament")
    public class Tournament implements Event {
    
        @Id
        @GeneratedValue
        private int id;
    
        @ElementCollection
        @CollectionTable (name = "tournament_eligible", joinColumns=@JoinColumn(name="id"))
        private List<String> username; // Contains a list of eligible members 
    
        @Size(min=5, max=45, message="Tournament Name must be between 5 and 60 characters",groups={PersistenceValidationGroup.class, FormValidationGroup.class})
        private String tournamentName; // Specified the name of the tournament
    
        private String tournamentGender = "MIXED"; // Specifies where a tournament is M(ale), F(emale) or MIXED;
    
        private String tournamentType = "S"; // Specifies S(ingles) or D(oubles)
    
        private String tournamentCategory = "O"; // Specifies Member_Type to be S(enior) only, J(unior) only, or O(pen) Tournament
    
        private String tournamentStyle = "L"; // Specfies type of Tournament to be  (L)adder/(L)eague, (B)ucket or (G)roup - Probably change this to a class later on.
    
        public Tournament(){
            this.username = new ArrayList<String>();
    

    我摆脱了注册类。这对于 String 对象来说有点多余,并不是真正需要的。

    【讨论】:

      【解决方案2】:

      在您的 Register 类中,您尝试将字符串列表映射为实体:

          @OneToMany(mappedBy="tournament")
          private List<String> registered;
      

      @OneToMany 仅用于实体之间的关系。 ListString 都不是实体。如果您想将基本值的Collection(如String)映射到表格,请查看@CollectionTable annotation

      【讨论】:

      • 太棒了!这似乎为我解决了问题。我现在将发布工人阶级。我以后可能还会打破它! :)
      猜你喜欢
      • 2010-11-24
      • 1970-01-01
      • 2011-04-04
      • 1970-01-01
      • 1970-01-01
      • 2011-05-12
      • 2012-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多