2017-02-21 4 views
1

私は今、hibernate、spring mvcを学んでおり、オブジェクトをデータベースに入れることができるアプリケーションを作成したいと思っています。しかし、私はオブジェクトを挿入するときに問題があります。 挿入後もデータベースが空であり、すべてのフィールドが空であり、問​​題がどこに正確に表示されるのかわかりません。Hibernate、Spring - データベースにテーブルを埋め込まない

Productクラス

@Entity 
public class Product { 
@Id 
private int id; 
@Column 
private String productId; 
@Column 
private String name; 
@Column 
private BigDecimal unitPrice; 
@Column 
private String description; 
@Column 
private String manufacturer; 
@Column 
private String category; 
@Column 
private long unitsInStock; 
@Column 
private long unitsInOrder; 
@Column 
private boolean discontinued; 
@Column 
private String condition; 
public Product(String productId, String name, BigDecimal unitPrice){ 
    this.productId = productId; 
    this.name = name; 
    this.unitPrice = unitPrice; 
} 

persistence.xmlの

<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 
version="2.0"> 
<persistence-unit name="myDatabase" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <properties> 

     <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" /> 
     <property name="javax.persistence.jdbc.user" value="tutorial" /> 
     <property name="javax.persistence.jdbc.password" value="password" /> 
     <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/mojabaza" /> 

     <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" /> 
     <property name="hibernate.hbm2ddl.auto" value="update" /> 
    </properties> 
</persistence-unit> 

InMemoryProductRepository.class

@Transactional 
@Repository 
public class InMemoryProductRepository implements ProductRepository { 

@PersistenceContext 
EntityManager entityManager; 

private List<Product> listOfProducts = new ArrayList<Product>(); 

public InMemoryProductRepository() { 
    Product iphone = new Product("P1234", "iPhone 5s", new BigDecimal(500)); 
    iphone.setDescription("Apple iPhone 5s, smartfon z 4-calowym wyswietlaczem o rozdielczosci 640x1136 oraz " 
      + "8-megapikselowym aparatem"); 
    iphone.setCategory("Smart Phone"); 
    iphone.setManufacturer("Apple"); 
    iphone.setUnitsInStock(1000); 
    iphone.setId(1); 


    listOfProducts.add(iphone); 

} 

public void insertProductToDatabase(Product product) { 
    entityManager.persist(product); 
} 

ProductService.class

@Service 
public class ProductServiceImpl implements ProductService{ 

@Autowired 
ProductRepository productRepository; 

public void insertProductToDatabase(Product product){ 
    productRepository.insertProductToDatabase(product); 
} 

ProductController 私は

@Controller 
@RequestMapping("/products") 
public class ProductController { 

@Autowired 
private ProductService productService; 

@RequestMapping 
public String list(Model model){   
    Product pr = new Product("P1", "okna", new BigDecimal(1000)); 
    pr.setId(1); 
    productService.insertProductToDatabase(pr); 
    productService.insertProductToDatabase(productService.getProductsById("P1234")); 
    model.addAttribute("products", productService.getAllProducts()); 
    return "products"; 
} 

データベースに、ここで2つのオブジェクトを挿入しようと誰も私を助けることができますか? :)

+1

あなたの '' ProductRepository 'がSpring DataからCrudRepository を拡張する場合、それをまったく実装する必要はありません - Spring Dataはそれを自動的に行います。私はこれをすべて手動でやってからしばらくしていましたが、永続してからフラッシュする必要があります。 – chrylis

+0

アプリケーションを永続化して実行した後にフラッシュすると、次のように書かれます。 要求の処理に失敗しました。ネストされた例外はjavax.persistence.TransactionRequiredException:トランザクションは進行中ではありません。 – Benji

答えて

0

を試してみてください。 entityManager.getTransaction().commit(); を挿入してみてください。

しかし、より簡単な方法でスプリングデータを使用してクラッシュ操作を行うことができます。例えば 、

public interface UserRepository extends JpaRepository<User, Long> { } 

その後、あなたは、単にどこかにuserrepositoryインターフェースをautowireすることができ、あなたは)ビルトイン(保存]を使用することができ、リポジトリの方法などを削除します。

関連する問題