-1

я являюсь свидетелем странного поведения в спящем режиме, у меня есть много для многих отношений и у меня есть таблицы, как показано нижезимуют многих ко многим отображения не вставляя строки в таблице соединения из сервисного слоя

Attribute -- Attribute_Category -- Category 

при попытке запуска моих Тест уровня DAO, спящий ввод строк во всех трех таблицах, включая таблицу соединений ATTRIBUTE_CATEGORY.

@Test 
@Rollback(false) 
public void testAddAttribute(){ 
    try { 
     AttributeDO attributeDO = getAttributeDO(); 
     List<AttributeDO> attributeDOs = new ArrayList<AttributeDO>(); 
     CategoryDO categoryDO = getAttributeDO().getCategoryDOs().get(0); 
     attributeDOs.add(attributeDO); 
     categoryDO.setAttributeDOs(attributeDOs); 
     attributeDAOImpl.addAttribute(attributeDO); 
     System.out.println("attribute id - " + attributeDO.getAttributeId()); 
    } catch (DataException cExp) { 
     cExp.printStackTrace(); 
     Assert.fail(); 
    } 
} 

, но когда я пытаюсь сделать то же самое на уровне обслуживания, только таблицы отображения вставлены, но не присоединяются к таблицам.

мой код реализации услуги

@Override 
@Transactional(propagation = Propagation.REQUIRED) 
public void addAttribute(AttributeBO attributeBO) throws CrafartServiceException { 
    AttributeDO attributeDO = mapper.mapAttributeBOToDO(attributeBO, new AttributeDO()); 
    CategoryDO categoryDO = mapper.mapCategoryBOToDO(attributeBO.getCategoryBO(), new CategoryDO(), new SeoDO()); 
    List<CategoryDO> categoryDOs = new ArrayList<>(); 
    categoryDOs.add(categoryDO); 
    attributeDO.setCategoryDOs(categoryDOs); 
    // creating bi directional relation ship between attribute --> category table. (category --> attribute cause unidirectional relation) 
    List<AttributeDO> attributeDOs = new ArrayList<>(); 
    attributeDOs.add(attributeDO); 
    categoryDO.setAttributeDOs(attributeDOs); 
    try { 
     attributeDAOImpl.addAttribute(attributeDO); 
     attributeBO.setAttributeId(attributeDO.getAttributeId()); 
    } catch (DataException cExp) { 
     throw new ServiceException("Service error - error while adding attribute", cExp); 
    } 
} 

я не вижу разницы между выполнением тестового дао и услуг, все я отображение бо делать объекты, и я сделать идентификатор слияния, как показано ниже

@Entity 
@Table(name = "ATTRIBUTE") 
public class AttributeDO implements Cloneable, Serializable { 

/** 
* serial id 
*/ 
private static final long serialVersionUID = -8629832877426207073L; 


@Id 
@Column(name = "attribute_id") 
@SequenceGenerator(name = "seq_attribute", sequenceName = "seq_attribute", allocationSize = 1) 
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_attribute") 
private long attributeId; 


@ManyToMany(mappedBy = "attributeDOs", cascade=CascadeType.MERGE) 
private List<CategoryDO> categoryDOs; 

моя категория сущность

@Entity 
@Table(name = "CATEGORY") 
public class CategoryDO implements Serializable, Cloneable { 
/** 
* 
*/ 
private static final long serialVersionUID = -870423497459160593L; 

@Id 
@Column(name = "category_id") 
@SequenceGenerator(name = "seq_category", sequenceName = "seq_category", allocationSize = 1) 
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_category") 
private long categoryId; 

@ManyToMany(cascade = { CascadeType.ALL }) 
@JoinTable(name = "ATTRIBUTE_CATEGORY", joinColumns = { @JoinColumn(name = "SUB_CATEGORY_ID") }, inverseJoinColumns = { @JoinColumn(name = "ATTRIBUTE_ID") }) 
private List<AttributeDO> attributeDOs; 

нужна помощь, чтобы решить эту W eird problem

ответ

-1

1 .dao Я использую те же объекты do для операций сохранения/слияния, где, как и в сервисном слое, мне нужно сопоставить bo, чтобы делать объекты, а теперь согласно правилам спящего режима, ни один из двух объектов не будет иметь одинаковый идентификатор, но в моем случае оба объекта bo и do будут иметь одинаковый идентификатор, поэтому мне нужно объединить объекты, если они имеют одинаковый идентификатор (категорию), после чего мне нужно сохранить объект атрибута, который я добавляю недавно.

2 другой способ, получить объект этого идентификатора

CategoryDO объекта = session.get (CateogryDO.class, categoryDO.getCategoryId);

и не делать saveorupdate, так как мы используем тот же объект, нет необходимости объединить работу здесь, это более актуально, чем предыдущий один

Смежные вопросы