【问题标题】:Spring-data-jpa OneToOne Unidirectional issueSpring-data-jpa OneToOne 单向问题
【发布时间】:2014-11-09 21:39:26
【问题描述】:

我试图在两个类“餐厅”和“经理”之间建立单向的 OneToOne 关系。 “Manager”是具有一个名为 restaurantId 的属性的子类。 这是我的代码,问题在下面解释:

餐厅.java:

    @Entity
    public class Restaurant implements Serializable{

         @Id
         private long id;


    //getters and setters}

RestaurantRepository.java

import java.util.List;

import org.springframework.data.repository.CrudRepository;

public interface RestaurantRepository extends CrudRepository<Restaurant, Long> {
    List<Restaurant> findById(long id);
}

Manager.java:

@Entity
public class Manager implements Serializable {



    @Id
        @GeneratedValue(strategy=GenerationType.AUTO)
        private long id;
        @OneToOne(fetch=FetchType.LAZY,optional=false,cascade = CascadeType.ALL)
        @JoinColumn(name="restaurantId", referencedColumnName="id",nullable=false)
        private Restaurant restaurantId;

        //getters and setters}

我正在尝试在下面的测试类中测试 Manager.java 的添加方法:

public class ManagerTest {

    private CrudRepository repository;
    @Test
    public void testAddManager() {
        AbstractApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");

        CrudRepository restaurantRepository = context.getBean(RestaurantRepository.class);

        Date date = new Date();
        Restaurant restaurant = (Restaurant) restaurantRepository.findOne(1L);
        repository = context.getBean(ManagerRepository.class);
        createManager("x","xx","xxxxxxxx","x","x","x","India","null","null", date, "jimish@auberginesolutions.com", restaurant);

        context.close();

    }

    private void createManager(String firstName, String lastName, String contactNo, String addrStreet,String addrCity, String addrState, String addrCountry, String addrLat, String addrLong, Date birthDate, String email, Restaurant restaurant){
        Manager manager = new Manager(firstName, lastName, contactNo, addrStreet, addrCity, addrState, addrCountry, addrLat, addrLong, birthDate, email);
        manager.setRestaurantId(restaurant);
        repository.save(manager);

    }
}

使用上面的代码,我期待在 Manager 表中有一个新条目,但它正在尝试在 Restaurant Table 中输入。

这是 Eclipse 中的控制台错误:

    Hibernate: insert into Restaurant (addrCity, addrCountry, addrLat, addrLong, addrState, addrStreet, contactNo, maxCapacity, name, id) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Sep 16, 2014 2:24:20 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: 1062, SQLState: 23000
Sep 16, 2014 2:24:20 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: Duplicate entry '1' for key 'PRIMARY'
Sep 16, 2014 2:24:20 PM org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl release
INFO: HHH000010: On release of batch it still contained JDBC statements

请帮帮我。任何建议都会很棒。:)

【问题讨论】:

  • 你们如何处理交易? ..我认为当您保存 Manager 和 CASCADE.ALL 时,resturant 已分离,并再次保留 ID = 1“重复主键”的 Resturat。你可以添加你的配置吗? .. 一个可能的测试是添加餐厅实体@GeneratedValue(strategy=GenerationType.AUTO),如果坚持另一个是我说的

标签: java eclipse hibernate jpa spring-data-jpa


【解决方案1】:

您可能正在尝试添加一个已存在 id 的条目

您要么忘记了 AUTO_INCREMENT id,要么为您的经理/餐厅选择了无效的(已经存在的)id。

您可以在此处找到更多详细信息 Error Code: 1062. Duplicate entry '1' for key 'PRIMARY'

【讨论】:

  • 我认为这里的问题是他指定了从 Manager 到 Restaurant 的单向 OneToOne 链接,然后尝试保存 Manager 对象。他链接到 manager 对象的 Restaurant 对象已经存在于 Db 中。因此,当您尝试创建经理记录时,它不应该再次尝试保存餐厅条目。如何防止保存餐厅入口?
猜你喜欢
  • 1970-01-01
  • 2021-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-07
  • 2015-07-10
  • 1970-01-01
  • 2015-04-17
相关资源
最近更新 更多